package com.codescan.admin.utils;

import com.codescan.admin.modules.codescan.vo.SourceReport;
import com.codescan.admin.modules.codescan.vo.XssScan;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.DottedLineSeparator;
import com.itextpdf.text.pdf.draw.LineSeparator;
import org.springframework.util.CollectionUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Objects;

public class PdfReport {
    // main测试
//    public static void main(String[] args) throws Exception {
//        try {
//            // 1.新建document对象
//            Document document = new Document(PageSize.A4);// 建立一个Document对象
//
//            // 2.建立一个书写器(Writer)与document对象关联
//            File file = new File("/Users/gxuehe/workspace/personal/PDFDemo.pdf");
//            file.createNewFile();
//            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
////            writer.setPageEvent(new Watermark("HELLO ITEXTPDF"));// 水印
////            writer.setPageEvent(new MyHeaderFooter());// 页眉/页脚
//
//            // 3.打开文档
//            document.open();
//            document.addTitle("Title@PDF-Java");// 标题
//            document.addAuthor("Author@umiz");// 作者
//            document.addSubject("Subject@iText pdf sample");// 主题
//            document.addKeywords("Keywords@iTextpdf");// 关键字
//            document.addCreator("Creator@umiz`s");// 创建者
//
//            // 4.向文档中添加内容
//            new PdfReport().generatePDF(document,null);
//
//            // 5.关闭文档
//            document.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

    // 定义全局的字体静态变量
    private static Font titlefont;
    private static Font headfont;
    private static Font keyfont;
    private static Font textfont;
    // 最大宽度
    private static int maxWidth = 520;
    // 静态代码块
    static {
        try {
            // 不同字体（这里定义为同一种字体：包含不同字号、不同style）
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            titlefont = new Font(bfChinese, 16, Font.BOLD);
            headfont = new Font(bfChinese, 14, Font.BOLD);
            keyfont = new Font(bfChinese, 10, Font.BOLD);
            textfont = new Font(bfChinese, 10, Font.NORMAL);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 生成PDF文件
    public void generatePDF(Document document, SourceReport sourceReport) throws Exception {

        // 段落
        Paragraph paragraph = new Paragraph("XSS Scanner", titlefont);
        paragraph.setAlignment(1); //设置文字居中 0靠左   1，居中     2，靠右
        paragraph.setIndentationLeft(12); //设置左缩进
        paragraph.setIndentationRight(12); //设置右缩进
        paragraph.setFirstLineIndent(24); //设置首行缩进
        paragraph.setLeading(20f); //行间距
        paragraph.setSpacingBefore(5f); //设置段落上空白
        paragraph.setSpacingAfter(10f); //设置段落下空白

        // 直线
        Paragraph p1 = new Paragraph();
        p1.add(new Chunk(new LineSeparator()));
        document.add(paragraph);


        // 点线
//        Paragraph p2 = new Paragraph();
//        p2.add(new Chunk(new DottedLineSeparator()));

//        // 超链接
//        Anchor anchor = new Anchor("baidu");
//        anchor.setReference("www.baidu.com");
//
//        // 定位
//        Anchor gotoP = new Anchor("goto");
//        gotoP.setReference("#top");

        // 添加图片
//        Image image = Image.getInstance("https://img-blog.csdn.net/20180801174617455?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNzg0ODcxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70");
//        image.setAlignment(Image.ALIGN_CENTER);
//        image.scalePercent(40); //依照比例缩放

        // 表格
        PdfPTable table = createTable(new float[] { 120, 120, 120, 120, 80 });
        table.addCell(createCell("代码地址:" + sourceReport.getTargetUrl(), headfont, Element.ALIGN_LEFT, 5, false));

        if(Objects.nonNull(sourceReport.getResults())){
            java.util.List<XssScan> list = sourceReport.getResults().getXssScan();
            if(!CollectionUtils.isEmpty(list)){
                if(list.size() >= 5){
                    table.addCell(createCell("问题数:"+ list.size() + "，状态：高风险", headfont, Element.ALIGN_LEFT, 5, false));
                }else{
                    table.addCell(createCell("问题数:"+ list.size() + "，状态：中风险", headfont, Element.ALIGN_LEFT, 5, false));
                }
                table.addCell(createCell("详情", headfont, Element.ALIGN_LEFT, 5, false));
                table.addCell(createCell("deliver", keyfont, Element.ALIGN_CENTER));
                table.addCell(createCell("parameter", keyfont, Element.ALIGN_CENTER));
                table.addCell(createCell("attack", keyfont, Element.ALIGN_CENTER));
                table.addCell(createCell("message", keyfont, Element.ALIGN_CENTER));
                table.addCell(createCell("certainty", keyfont, Element.ALIGN_CENTER));
                for(XssScan xssScan : list) {
                    table.addCell(createCell(xssScan.getDeliver(), headfont, Element.ALIGN_CENTER));
                    table.addCell(createCell(xssScan.getParameter(), keyfont, Element.ALIGN_CENTER));
                    table.addCell(createCell(xssScan.getAttack(), keyfont, Element.ALIGN_CENTER));
                    table.addCell(createCell(xssScan.getMessage(), keyfont, Element.ALIGN_CENTER));
                    table.addCell(createCell(xssScan.getCertainty(), keyfont, Element.ALIGN_CENTER));
                }
            }else {
                table.addCell(createCell("问题数: 0" +"，状态：无漏洞", headfont, Element.ALIGN_LEFT, 5, false));
            }
        }


//        document.add(anchor);
//        document.add(p2);
//        document.add(gotoP);
        document.add(p1);
        document.add(table);
//        document.add(image);
    }


/**------------------------创建表格单元格的方法start----------------------------*/
    /**
     * 创建单元格(指定字体)
     * @param value
     * @param font
     * @return
     */
    public PdfPCell createCell(String value, Font font) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平..）
     * @param value
     * @param font
     * @param align
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平居..、单元格跨x列合并）
     * @param value
     * @param font
     * @param align
     * @param colspan
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align, int colspan) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平居..、单元格跨x列合并、设置单元格内边距）
     * @param value
     * @param font
     * @param align
     * @param colspan
     * @param boderFlag
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);
        cell.setPhrase(new Phrase(value, font));
        cell.setPadding(3.0f);
        if (!boderFlag) {
            cell.setBorder(0);
            cell.setPaddingTop(15.0f);
            cell.setPaddingBottom(8.0f);
        } else if (boderFlag) {
            cell.setBorder(0);
            cell.setPaddingTop(0.0f);
            cell.setPaddingBottom(15.0f);
        }
        return cell;
    }
    /**
     * 创建单元格（指定字体、水平..、边框宽度：0表示无边框、内边距）
     * @param value
     * @param font
     * @param align
     * @param borderWidth
     * @param paddingSize
     * @param flag
     * @return
     */
    public PdfPCell createCell(String value, Font font, int align, float[] borderWidth, float[] paddingSize, boolean flag) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setPhrase(new Phrase(value, font));
        cell.setBorderWidthLeft(borderWidth[0]);
        cell.setBorderWidthRight(borderWidth[1]);
        cell.setBorderWidthTop(borderWidth[2]);
        cell.setBorderWidthBottom(borderWidth[3]);
        cell.setPaddingTop(paddingSize[0]);
        cell.setPaddingBottom(paddingSize[1]);
        if (flag) {
            cell.setColspan(2);
        }
        return cell;
    }
/**------------------------创建表格单元格的方法end----------------------------*/


/**--------------------------创建表格的方法start------------------- ---------*/
    /**
     * 创建默认列宽，指定列数、水平(居中、右、左)的表格
     * @param colNumber
     * @param align
     * @return
     */
    public PdfPTable createTable(int colNumber, int align) {
        PdfPTable table = new PdfPTable(colNumber);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(align);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }
    /**
     * 创建指定列宽、列数的表格
     * @param widths
     * @return
     */
    public PdfPTable createTable(float[] widths) {
        PdfPTable table = new PdfPTable(widths);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }
    /**
     * 创建空白的表格
     * @return
     */
    public PdfPTable createBlankTable() {
        PdfPTable table = new PdfPTable(1);
        table.getDefaultCell().setBorder(0);
        table.addCell(createCell("", keyfont));
        table.setSpacingAfter(20.0f);
        table.setSpacingBefore(20.0f);
        return table;
    }
/**--------------------------创建表格的方法end------------------- ---------*/


}

//public class MyHeaderFooter extends PdfPageEventHelper {
//    // 总页数
//    PdfTemplate totalPage;
//    Font hfFont;
//    {
//        try {
//            hfFont = new Font(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), 8, Font.NORMAL);
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    // 打开文档时，创建一个总页数的模版
//    public void onOpenDocument(PdfWriter writer, Document document) {
//        PdfContentByte cb =writer.getDirectContent();
//        totalPage = cb.createTemplate(30, 16);
//    }
//    // 一页加载完成触发，写入页眉和页脚
//    public void onEndPage(PdfWriter writer, Document document) {
//        PdfPTable table = new PdfPTable(3);
//        try {
//            table.setTotalWidth(PageSize.A4.getWidth() - 100);
//            table.setWidths(new int[] { 24, 24, 3});
//            table.setLockedWidth(true);
//            table.getDefaultCell().setFixedHeight(-10);
//            table.getDefaultCell().setBorder(Rectangle.BOTTOM);
//
//            table.addCell(new Paragraph("我是页眉/页脚", hfFont));// 可以直接使用addCell(str)，不过不能指定字体，中文无法显示
//            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
//            table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));
//            // 总页数
//            PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
//            cell.setBorder(Rectangle.BOTTOM);
//            table.addCell(cell);
//            // 将页眉写到document中，位置可以指定，指定到下面就是页脚
//            table.writeSelectedRows(0, -1, 50,PageSize.A4.getHeight() - 20, writer.getDirectContent());
//        } catch (Exception de) {
//            throw new ExceptionConverter(de);
//        }
//    }
//
//    // 全部完成后，将总页数的pdf模版写到指定位置
//    public void onCloseDocument(PdfWriter writer,Document document) {
//        String text = "总" + (writer.getPageNumber()) + "页";
//        ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,hfFont), 2, 2, 0);
//    }

//}
